package com.zishuimuyu.http;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;

import java.io.File;

/**
 * 该类继承自 AbstractHttpParams，用于处理包含 MIME 类型参数的 HTTP POST 请求
 *
 * @author Marscode
 * @version 1.0
 */
public class HttpMimeParams extends AbstractHttpParams {

    /**
     * 重写父类的 send 方法，用于发送包含 MIME 类型参数的 HTTP POST 请求
     *
     * @param httpClient 可关闭的 HTTP 客户端，用于执行 HTTP 请求
     * @param baseUrl    请求的基础 URL
     * @return 包含响应信息的 CloseableHttpResponse 对象
     * @throws Exception 如果在构建实体、发送请求或处理响应过程中发生异常
     */
    @Override
    protected CloseableHttpResponse send(CloseableHttpClient httpClient, String baseUrl) throws Exception {
        // 1) 构建实体
        // 创建一个 MultipartEntityBuilder 实例，用于构建多部分实体
        MultipartEntityBuilder entBuilder = MultipartEntityBuilder.create();
        // 遍历存储参数的 Map
        for (String key : params.keySet()) {
            // 获取当前键对应的值
            Object item = params.get(key);
            // 检查值是否为 File 类型
            if (item instanceof File) {
                // 将对象转换为 File 类型
                File file = (File) item;
                // 检查文件是否存在以及是否为目录
                if ((!file.exists()) || (file.isDirectory())) {
                    // 如果文件不存在或为目录，抛出异常
                    throw new Exception("file error");
                }
                // 向 MultipartEntityBuilder 中添加文件部分
                entBuilder.addPart(key, new FileBody(file));
            }
            // 检查值是否为 String 类型
            else if (item instanceof String) {
                // 将对象转换为 String 类型
                String value = (String) item;
                // 向 MultipartEntityBuilder 中添加字符串部分，指定内容类型为文本纯文本
                entBuilder.addPart(key, new StringBody(value, ContentType.TEXT_PLAIN));
            }
            // 如果值既不是 File 也不是 String 类型
            else {
                // 抛出异常，提示不支持该类型
                throw new Exception(item.getClass().toString() + " not support");
            }
        }
        // 构建最终的 HttpEntity 对象
        HttpEntity reqEntity = entBuilder.build();

        // 2) 发送并等待回复
        // 创建一个 HttpPost 请求对象，使用传入的基础 URL
        HttpPost request = new HttpPost(baseUrl);
        // 将构建好的实体设置到请求中
        request.setEntity(reqEntity);
        // 使用传入的 HTTP 客户端执行请求，并返回响应
        return httpClient.execute(request);
    }
}
